Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / frontend / helpers / frontendOwnershipHelpers.js

Displaying Raw • Download


tests/frontend/helpers/frontendOwnershipHelpers.js 9c739fa940d1bcaefcd5de9a3b461762a7200103 (9c739fa9) Text, 11.14 KB

T8b949e// SPDX-License-Identifier: 0BSD

Tff7b72import Tb4b4b4{ Te6edf3existsSyncTb4b4b4, Te6edf3readdirSyncTb4b4b4, Te6edf3readFileSyncTb4b4b4, Te6edf3writeFileSyncTb4b4b4, Te6edf3statSync Tb4b4b4} Tff7b72from Ta5d6ff"fs"Tb4b4b4;
Tff7b72import Tb4b4b4{ Te6edf3joinTb4b4b4, Te6edf3relative Tb4b4b4} Tff7b72from Ta5d6ff"path"Tb4b4b4;

Tff7b72export Tff7b72function Te6edf3repoRootFromCwdTb4b4b4(Te6edf3cwd Tff7b72= Te6edf3processTb4b4b4.Te6edf3cwdTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3cwdTb4b4b4;
Tb4b4b4}

Tff7b72export Tff7b72function Te6edf3readUtf8Tb4b4b4(Te6edf3absolutePathTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3readFileSyncTb4b4b4(Te6edf3absolutePathTb4b4b4, Ta5d6ff"utf8"Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72export Tff7b72function Te6edf3listFilesRecursiveTb4b4b4(Te6edf3dirTb4b4b4, Te6edf3extsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3out Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3existsSyncTb4b4b4(Te6edf3dirTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3outTb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3name Tff7b72of Te6edf3readdirSyncTb4b4b4(Te6edf3dirTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3full Tff7b72= Te6edf3joinTb4b4b4(Te6edf3dirTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3st Tff7b72= Te6edf3statSyncTb4b4b4(Te6edf3fullTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3stTb4b4b4.Te6edf3isDirectoryTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4...Te6edf3listFilesRecursiveTb4b4b4(Te6edf3fullTb4b4b4, Te6edf3extsTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3extsTb4b4b4.Te6edf3someTb4b4b4(Tb4b4b4(Te6edf3extTb4b4b4) Tb4b4b4=> Te6edf3nameTb4b4b4.Te6edf3endsWithTb4b4b4(Te6edf3extTb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3fullTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3outTb4b4b4;
Tb4b4b4}

Tff7b72export Tff7b72function Te6edf3joinFeatureSourcesTb4b4b4(Te6edf3repoRootTb4b4b4, Te6edf3relativeDirsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3chunks Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3rel Tff7b72of Te6edf3relativeDirsTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3abs Tff7b72= Te6edf3joinTb4b4b4(Te6edf3repoRootTb4b4b4, Te6edf3relTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3statSyncTb4b4b4(Te6edf3absTb4b4b4, Tb4b4b4{ Te6edf3throwIfNoEntryTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4)Tff7b72?Tb4b4b4.Te6edf3isFileTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3chunksTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3readUtf8Tb4b4b4(Te6edf3absTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72continueTb4b4b4;
Tb4b4b4}
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3file Tff7b72of Te6edf3listFilesRecursiveTb4b4b4(Te6edf3absTb4b4b4, Tb4b4b4[Ta5d6ff".vue"Tb4b4b4, Ta5d6ff".js"Tb4b4b4]Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3chunksTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3readUtf8Tb4b4b4(Te6edf3fileTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3chunksTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"\n"Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72export Tff7b72function Te6edf3discoverMegaPageOwnershipTb4b4b4(Te6edf3repoRootTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3pages Tff7b72= Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff"settings"Tb4b4b4,
Te6edf3shellTff7b72: Ta5d6ff"meshchatx/src/frontend/components/settings/SettingsPage.vue"Tb4b4b4,
Te6edf3allowed_child_dirsTff7b72: Tb4b4b4[
Ta5d6ff"meshchatx/src/frontend/components/settings/sections"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/js/settings"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3required_childrenTff7b72: Tb4b4b4[
Ta5d6ff"meshchatx/src/frontend/components/settings/SettingToggleRow.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/SettingsSectionBlock.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/LanguageSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/DesktopSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/StrangerProtectionSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/BanishmentSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/StickersSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/GifsSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/TelephonySettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/AppearanceSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/BatterySettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/VisualiserSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/BlockedSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/AndroidSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/sections/ArchiverSettingsSection.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/settings/PluginsSettingsSection.vue"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3required_shell_importsTff7b72: Tb4b4b4[
Ta5d6ff"LanguageSettingsSection"Tb4b4b4,
Ta5d6ff"DesktopSettingsSection"Tb4b4b4,
Ta5d6ff"StrangerProtectionSettingsSection"Tb4b4b4,
Ta5d6ff"BanishmentSettingsSection"Tb4b4b4,
Ta5d6ff"StickersSettingsSection"Tb4b4b4,
Ta5d6ff"GifsSettingsSection"Tb4b4b4,
Ta5d6ff"TelephonySettingsSection"Tb4b4b4,
Ta5d6ff"AppearanceSettingsSection"Tb4b4b4,
Ta5d6ff"BatterySettingsSection"Tb4b4b4,
Ta5d6ff"VisualiserSettingsSection"Tb4b4b4,
Ta5d6ff"BlockedSettingsSection"Tb4b4b4,
Ta5d6ff"AndroidSettingsSection"Tb4b4b4,
Ta5d6ff"ArchiverSettingsSection"Tb4b4b4,
Ta5d6ff"PluginsSettingsSection"Tb4b4b4,
Ta5d6ff"SettingsSectionBlock"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff"map"Tb4b4b4,
Te6edf3shellTff7b72: Ta5d6ff"meshchatx/src/frontend/components/map/MapPage.vue"Tb4b4b4,
Te6edf3allowed_child_dirsTff7b72: Tb4b4b4[Ta5d6ff"meshchatx/src/frontend/components/map/internal"Tb4b4b4, Ta5d6ff"meshchatx/src/frontend/js"Tb4b4b4]Tb4b4b4,
Te6edf3required_childrenTff7b72: Tb4b4b4[
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapClusterPanel.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapMarkerPanel.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapDrawingToolbar.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapBearingInstructions.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapSearchBar.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapExportInstructions.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapExportConfigPanel.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapExportProgressPanel.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapLoadingOverlay.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapVectorExchangePanel.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapRemoteOverlayPanel.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapSaveDrawingModal.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapLoadDrawingModal.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/MapMobileNoteModal.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/clusterUtils.js"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/discoveredIcons.js"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/mapDedupe.js"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/map/internal/markerStyles.js"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3required_shell_importsTff7b72: Tb4b4b4[
Ta5d6ff"MapClusterPanel"Tb4b4b4,
Ta5d6ff"MapMarkerPanel"Tb4b4b4,
Ta5d6ff"MapDrawingToolbar"Tb4b4b4,
Ta5d6ff"MapBearingInstructions"Tb4b4b4,
Ta5d6ff"MapSearchBar"Tb4b4b4,
Ta5d6ff"MapExportInstructions"Tb4b4b4,
Ta5d6ff"MapExportConfigPanel"Tb4b4b4,
Ta5d6ff"MapExportProgressPanel"Tb4b4b4,
Ta5d6ff"MapLoadingOverlay"Tb4b4b4,
Ta5d6ff"MapVectorExchangePanel"Tb4b4b4,
Ta5d6ff"MapRemoteOverlayPanel"Tb4b4b4,
Ta5d6ff"MapSaveDrawingModal"Tb4b4b4,
Ta5d6ff"MapLoadDrawingModal"Tb4b4b4,
Ta5d6ff"MapMobileNoteModal"Tb4b4b4,
Ta5d6ff"clusterUtils"Tb4b4b4,
Ta5d6ff"discoveredIcons"Tb4b4b4,
Ta5d6ff"mapDedupe"Tb4b4b4,
Ta5d6ff"markerStyles"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff"messages"Tb4b4b4,
Te6edf3shellTff7b72: Ta5d6ff"meshchatx/src/frontend/components/messages/ConversationViewer.vue"Tb4b4b4,
Te6edf3allowed_child_dirsTff7b72: Tb4b4b4[
Ta5d6ff"meshchatx/src/frontend/components/messages"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/composer"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/modals"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/outbound"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/lxmf"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/telemetry"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3required_childrenTff7b72: Tb4b4b4[
Ta5d6ff"meshchatx/src/frontend/components/messages/ConversationPeerHeader.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/ConversationMessageEntry.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/conversationMessageHelpers.js"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/outbound/OutboundTransferProgressFooter.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/modals/ShareContactModal.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/modals/ConversationImageModal.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/composer/AddImageButton.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/lxmf/contactDisplay.js"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/messages/lxmf/normalize.js"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3required_shell_importsTff7b72: Tb4b4b4[
Ta5d6ff"ConversationPeerHeader"Tb4b4b4,
Ta5d6ff"ConversationMessageEntry"Tb4b4b4,
Ta5d6ff"conversationMessageHelpers"Tb4b4b4,
Ta5d6ff"ShareContactModal"Tb4b4b4,
Ta5d6ff"ConversationImageModal"Tb4b4b4,
Ta5d6ff"AddImageButton"Tb4b4b4,
Ta5d6ff"contactDisplay"Tb4b4b4,
Ta5d6ff"normalize"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff"call"Tb4b4b4,
Te6edf3shellTff7b72: Ta5d6ff"meshchatx/src/frontend/components/call/CallPage.vue"Tb4b4b4,
Te6edf3allowed_child_dirsTff7b72: Tb4b4b4[
Ta5d6ff"meshchatx/src/frontend/components/call"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/call/tabs"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/call/audio"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3required_childrenTff7b72: Tb4b4b4[
Ta5d6ff"meshchatx/src/frontend/components/call/CallOverlay.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/call/audio/RingtoneEditor.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/call/tabs/CallPhonebookTab.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/call/tabs/CallContactsTab.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/call/tabs/CallVoicemailTab.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/call/tabs/CallTabBar.vue"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3required_shell_importsTff7b72: Tb4b4b4[
Ta5d6ff"RingtoneEditor"Tb4b4b4,
Ta5d6ff"CallPhonebookTab"Tb4b4b4,
Ta5d6ff"CallContactsTab"Tb4b4b4,
Ta5d6ff"CallVoicemailTab"Tb4b4b4,
Ta5d6ff"CallTabBar"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff"app"Tb4b4b4,
Te6edf3shellTff7b72: Ta5d6ff"meshchatx/src/frontend/components/App.vue"Tb4b4b4,
Te6edf3allowed_child_dirsTff7b72: Tb4b4b4[Ta5d6ff"meshchatx/src/frontend/components/layout"Tb4b4b4, Ta5d6ff"meshchatx/src/frontend/components/call"Tb4b4b4]Tb4b4b4,
Te6edf3required_childrenTff7b72: Tb4b4b4[
Ta5d6ff"meshchatx/src/frontend/components/layout/AppShellBanners.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/layout/AppIdentitySwitchOverlay.vue"Tb4b4b4,
Ta5d6ff"meshchatx/src/frontend/components/call/CallOverlay.vue"Tb4b4b4,
Tb4b4b4]Tb4b4b4,
Te6edf3required_shell_importsTff7b72: Tb4b4b4[Ta5d6ff"AppShellBanners"Tb4b4b4, Ta5d6ff"AppIdentitySwitchOverlay"Tb4b4b4, Ta5d6ff"CallOverlay"Tb4b4b4, Ta5d6ff"listNavItems"Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Tb4b4b4;

Tff7b72return Tb4b4b4{
Te6edf3versionTff7b72: T79c0ff1Tb4b4b4,
Te6edf3pagesTff7b72: Te6edf3pagesTb4b4b4.Te6edf3mapTb4b4b4(Tb4b4b4(Te6edf3pageTb4b4b4) Tb4b4b4=> Tb4b4b4(Tb4b4b4{
Tb4b4b4...Te6edf3pageTb4b4b4,
Te6edf3required_childrenTff7b72: Te6edf3pageTb4b4b4.Te6edf3required_childrenTb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3relTb4b4b4) Tb4b4b4=> Te6edf3existsSyncTb4b4b4(Te6edf3joinTb4b4b4(Te6edf3repoRootTb4b4b4, Te6edf3relTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3required_shell_importsTff7b72: Te6edf3pageTb4b4b4.Te6edf3required_shell_importsTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}

Tff7b72export Tff7b72function Te6edf3writeOwnershipFixtureTb4b4b4(Te6edf3repoRootTb4b4b4, Te6edf3fixturePathTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3payload Tff7b72= Te6edf3discoverMegaPageOwnershipTb4b4b4(Te6edf3repoRootTb4b4b4)Tb4b4b4;
Te6edf3writeFileSyncTb4b4b4(Te6edf3fixturePathTb4b4b4, Ta5d6ff`Tffd700${Tffa657JSONTb4b4b4.Te6edf3stringifyTb4b4b4(Te6edf3payloadTb4b4b4, Tff7b72nullTb4b4b4, T79c0ff4Tb4b4b4)Tffd700}Ta5d6ff\nTa5d6ff`Tb4b4b4, Ta5d6ff"utf8"Tb4b4b4)Tb4b4b4;
Tff7b72return Te6edf3payloadTb4b4b4;
Tb4b4b4}

Tff7b72export Tff7b72function Te6edf3loadJsonFixtureTb4b4b4(Te6edf3repoRootTb4b4b4, Te6edf3relativePathTb4b4b4) Tb4b4b4{
Tff7b72return Tffa657JSONTb4b4b4.Te6edf3parseTb4b4b4(Te6edf3readUtf8Tb4b4b4(Te6edf3joinTb4b4b4(Te6edf3repoRootTb4b4b4, Te6edf3relativePathTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Tff7b72export Tff7b72function Te6edf3assertStringsInSourcesTb4b4b4(Te6edf3sourceTextTb4b4b4, Te6edf3requiredStringsTb4b4b4, Te6edf3labelTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3missing Tff7b72= Te6edf3requiredStringsTb4b4b4.Te6edf3filterTb4b4b4(Tb4b4b4(Te6edf3sTb4b4b4) Tb4b4b4=> Tff7b72!Te6edf3sourceTextTb4b4b4.Te6edf3includesTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3missingTb4b4b4.Te6edf3lengthTb4b4b4) Tb4b4b4{
Tff7b72throw Tff7b72new Tf85149ErrorTb4b4b4(Ta5d6ff`Tffd700${Te6edf3labelTffd700}Ta5d6ff missing required strings: Tffd700${Te6edf3missingTb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff", "Tb4b4b4)Tffd700}Ta5d6ff`Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72export Tff7b72function Te6edf3relativeRepoPathTb4b4b4(Te6edf3repoRootTb4b4b4, Te6edf3absolutePathTb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3relativeTb4b4b4(Te6edf3repoRootTb4b4b4, Te6edf3absolutePathTb4b4b4)Tb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"\\"Tb4b4b4)Tb4b4b4.Te6edf3joinTb4b4b4(Ta5d6ff"/"Tb4b4b4)Tb4b4b4;
Tb4b4b4}


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────